#include <string.h>
#include <stdio.h>
#include <stdlib.h>


#include "xparameters.h"
#include "stdio.h"
#include "xgpio_l.h"
#include "xemaclite.h"
#include "xgpio.h"


#include "xutil.h"
#include "stacks.h"
#include "Utilidades.h"




//interpreta cada una de las instrucciones del interprete
void Ejecutar()
{
     //Leer_Instrucciones();
	//char *str = "824633720832\n721554505731\n790273982464\n824633720832\n34359934976\n858993459200\n34359934976\n858993459200\n34359902208\n858993459200\n790273982464";
	//char    **listSplit;
	//listSplit = split(str,'\n');
	//LeerLineas(listSplit);
	 error = 0;
     int i = 0;
     push_Pila_Retornos(NLINEAS+1);
     push_Pila_PilaVarables();
     *p = NLINEAS<<4;
     int q;
     	 for(q=0;q<5000000;q++)
     			;
     while(i < NLINEAS)
     {
         int64 instActual=lineas[i];
         int tipo=Tipo_Instruccion(instActual);

         switch (tipo)
         {
                case 0:                        //pushv
                {
                     int id=Mask_35b(instActual);
                     DATA v=get_valor_Pila_Variables(id);
                     push_Pila_Oper(v);
                     i++;
                     if(error == 1)
                          i = NLINEAS;
                     break;
                }
                case 1:                         //pushe
                {
                     int ve=Mask_20b_Entero(instActual);
                     DATA v;
                     v.di=ve;
                     v.tipo=0;
                     push_Pila_Oper(v);
                     i++;
                     if(error == 1)
                          i = NLINEAS;
                     break;
                }
                case 2:                         //pushr
                {
                     char vent[30];
                     char vdec[30];
                     int ve=Mask_20b_Entero(instActual);
                     int vd=Mask_14b(instActual);
                     sprintf(vent,"%d",ve);
                     sprintf(vdec,"%d",vd);
                     strcat(vent,".");
                     strcat(vent,vdec);
                     DATA v;
                     v.df=atof(vent);
                     v.tipo=1;
                     push_Pila_Oper(v);
                     i++;
                     if(error == 1)
                           i = NLINEAS;
                     break;
                }
                case 3:                         //pushb
                {
                     int ve=Mask_20b_Entero(instActual);
                     DATA v;
                     v.di=ve;
                     v.tipo=2;
                     push_Pila_Oper(v);
                     i++;
                     if(error == 1)
                            i = NLINEAS;
                     break;
                }
                case 4:                            //= var
                {
                     int id=Mask_35b(instActual);
                     DATA v;
                     v=pop_Pila_Oper();
                     Add_Variable_PilaVarables(id,v);
                     i++;
                     break;
                }
                case 5:                            //+
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(5,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                    	 i = NLINEAS;
                     break;
                }
                case 6:                            //-
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(6,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                    	 i = NLINEAS;
                     break;
                }
                case 7:                            //*
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(7,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                         i = NLINEAS;
                     break;
                }
                case 8:                            //'/'
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(8,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                         i = NLINEAS;
                     break;
                }
                case 9:                            //Uminus
                {
                     DATA v=pop_Pila_Oper();
                     DATA aux=Operacion_Unaria(9,v);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                         i = NLINEAS;
                     break;
                }
                case 10:                            //<
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(10,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                         i = NLINEAS;
                     break;
                }
                case 11:                            //>
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(11,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                         i = NLINEAS;
                     break;
                }
                case 12:                            //<=
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(12,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                         i = NLINEAS;
                     break;
                }
                case 13:                            //>=
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(13,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                         i = NLINEAS;
                     break;
                }
                case 14:                            //==
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(14,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                          i = NLINEAS;
                     break;
                }
                case 15:                            //!=
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(15,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                          i = NLINEAS;
                     break;
                }
                case 16:                            //y
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(16,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                          i = NLINEAS;
                     break;
                }
                case 17:                            //o
                {
                     DATA v1=pop_Pila_Oper();
                     DATA v2=pop_Pila_Oper();
                     DATA aux=Operacion_Binaria(17,v2,v1);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                          i = NLINEAS;
                     break;
                }
                case 18:                            //!
                {
                     DATA v=pop_Pila_Oper();
                     DATA aux=Operacion_Unaria(18,v);
                     push_Pila_Oper(aux);
                     i++;
                     if(error == 1)
                          i = NLINEAS;
                     break;
                }
                case 19:                            //jumpFalse
                {
                     DATA v=pop_Pila_Oper();
                     i=Proces_jumpFalse(i,v,instActual);
                     if(error == 1)
                          i = NLINEAS;
                     break;
                }
                case 20:                            //goto
                {
                     i=Mask_35b(instActual);
                     break;
                }
                case 21:                            //call
                {
                     push_Pila_PilaVarables();
                     push_Pila_Retornos(i+1);
                     i=Mask_35b(instActual);
                     if(error == 1)
                          i = NLINEAS;
                     break;
                }
                case 22:                            //retorno
                {
                     pop_Pila_PilaVarables();
                     int aux=pop_Pila_Retornos();
                     i=aux;
                     if(error == 1)
                         i = NLINEAS;
                     break;
                }
                case 23:                            //<finfuncion>
                {
                     pop_Pila_PilaVarables();
                     int aux=pop_Pila_Retornos();
                     DATA v;
                     v.tipo=3;
                     push_Pila_Oper(v);
                     i=aux;
                     *p = aux<<4;
                     if(error == 1)
                         i = NLINEAS;

                     break;
                }
                case 24:                            //<etiqueta>
                {
                     i++;
                     break;
                }
                case 25:                            //avanzar -av
                {
					 DATA aux=pop_Pila_Oper();
					 Avanzar(aux, 1);
					 i++;
					 if(error == 1)
					     i = NLINEAS;

					 break;
				}
                case 26:                            //retroceder -rt
                {
                     DATA aux=pop_Pila_Oper();
                     Avanzar(aux, 0);
                     i++;
                     if(error == 1)
                          i = NLINEAS;
                     break;
                }
                case 27:                            //girarderecha -gd
                {
					 DATA aux=pop_Pila_Oper();
					 Girar(aux, 0);
					 i++;
					 if(error == 1)
					      i = NLINEAS;
					 break;
                }
                case 28:                            //girarizquierda gi
                {
                     DATA aux=pop_Pila_Oper();
                     Girar(aux, 1);
                     i++;
                     if(error == 1)
                          i = NLINEAS;
                     break;
                }
                case 29:                            //borrarpantalla -bp
                {
                     i++;
                     break;
                }
                case 30:                            //bajarpluma -bp
                {
                     Enviar_To_Motores(50);
                     i++;
                     break;
                }
                case 31:                            //subirpluma -sp
                {
                     Enviar_To_Motores(50);
                     i++;
                     break;
                }
                case 32:                            //escribe
                {
                     pop_Pila_Oper();
                     i++;
                     if(error == 1)
                         i = NLINEAS;
                     break;
                }
                case 33:                            //alto -al
                {
                     pop_Pila_PilaVarables();
                     int aux=pop_Pila_Retornos();
                     i=aux;
                     if(error == 1)
                         i = NLINEAS;
                     break;
                }
                case 34:                            //limpiar
                {
                     Clear_Pila_Oper();
                     i++;
                     break;
                }
                default:
                {

                	Error(4);
                	i = NLINEAS;
                }

                
                
         }
     }



}

